package com.java.annotation;

import java.lang.annotation.*;

/**
 * - @Documented：定义注解的元注解
 * - @Target：指定注解可应用的目标类型
 * -        ElementType.TYPE：类、接口、枚举
 * -        ElementType.METHOD：方法
 * -        ElementType.FIELD：字段
 * -        ElementType.PARAMETER：参数
 * -        ElementType.CONSTRUCTOR：构造函数
 * -        ElementType.LOCAL_VARIABLE：局部变量
 * -        ElementType.ANNOTATION_TYPE：注解类型
 * -        ElementType.PACKAGE：包
 * -        ElementType.TYPE_PARAMETER：类型参数(JDK 8+)
 * -        ElementType.TYPE_USE：类型使用(JDK 8+)
 * - @Retention：注解保留策略，运行时可见
 * - @Inherited：允许子类继承父类的注解
 * - @Repeatable：可重复注解容器(JDK 8+)
 */
@Documented
@Target({ElementType.METHOD,})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation {
    // @AliasFor：定义属性别名，springframework注解
    String strValue() default "";
    
    int intValue() default 0;
    
    long longValue() default 0L;
    
    boolean booleanValue() default false;
    
    Class<?> classValue() default Void.class;
    
    String[] arrayValue() default {};
    
    // 枚举
    EnumType enumValue() default EnumType.VALUE1;
    
    enum EnumType {
        VALUE1, VALUE2, VALUE3
    }
    
    
    // 占位符
    String configValue() default "${default.value}";
    
    // 处理器接口
    interface Processor {
        void process();
    }
    
    // 默认处理器实现，自定义实现类实现MyAnnotation.Processor可覆盖默认处理器实现
    class DefaultProcessor implements Processor {
        @Override
        public void process() {
            System.out.println("Processing with default processor");
        }
    }
}
